package com.itservice.supporter_navi.MarathonDataBase.libs;

import java.util.ArrayList;

import android.content.res.Resources;
import android.content.res.TypedArray;
import android.text.TextUtils;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.itservice.supporter_navi.R;


public class MarathonCourseData {
	public int SettingCourseNo = 0; // 現在設定されている大会番号

	private final String PACKAGENAME = "com.itservice.supporter_navi";
	private static MarathonCourseData m_Instance = null;
	private static Resources m_Resources = null;
	private ArrayList<Convention>  m_ConventionList; // 大会リスト
	private ArrayList<Course> m_CourseList;		// コースリスト
	private ArrayList<Distance> m_DistanceList;	// 距離表示リスト
	private ArrayList<BestPosition> m_BestPositionList;	// 名所位置リスト

	//シングルトンのためgetInstanceを生成
	//インスタンスが生成されていない場合newを行う。
	public static MarathonCourseData getInstance(Resources res) {
		if(null == m_Instance)
		{
			m_Instance = new MarathonCourseData(res);
		}
		return m_Instance;
	}

	// コンストラクタ
	private MarathonCourseData(Resources res)
	{
		m_ConventionList = new ArrayList<Convention>();
		m_Resources = res;

		SettingCourseNo = 0;
		// XMLデータより大会リスト情報のみ先に取得する。
        TypedArray typedArray = m_Resources.obtainTypedArray(R.array.ConventionList);

        // 配列の要素数(ここではConventionListの子要素の数)
        int length = typedArray.length();
		Convention conventionData;

		// 要素数分ループして大会リストを追加していく
        for(int i = 0; i < length; i++)
        {
            // 配列の値を取得
        	int resourceId = typedArray.getResourceId(i, -1);
        	if(resourceId != -1)
        	{
        		String[] array = m_Resources.getStringArray(resourceId);
        		conventionData = new Convention(Integer.valueOf(array[0]),array[1]);
        		m_ConventionList.add(conventionData);
        	}
        }
	}

	// 現在アプリ上に格納されている大会リストを返す。
	public ArrayList<Convention> GetConventionList()
	{
		return m_ConventionList;
	}

	// 今回使用する大会の情報をセットする。
	// セットされたタイミングで、緯度経度情報をXMLより取得する。
	// 引数：No： m_ConventionListに設定された大会の番号
	// 返値：Boolean：Ture：XMLデータより正常に取得完了、False：取得失敗
	public Boolean SetConvention(int no)
	{
		// インデックスの数が現在の大会リストよりも大きかった場合エラー
		int index = m_ConventionList.indexOf(new Convention(no, ""));
        Log.v("MarathonApplication", "SetConvention No[" + no + "] Index[" + index + "]");

		if(index == -1)
		{
			return false;
		}

		SettingCourseNo = no;

		// 大会情報が正しく存在した場合、
		// 大会番号が一致しているものを内部データに展開する。

		//////////////////////
		// コースリスト取得 //
		//////////////////////
		m_CourseList = new ArrayList<Course>();

		int courseId = m_Resources.getIdentifier("CourseData" + no, "array", PACKAGENAME);
        Log.v("MarathonApplication", "SetConvention CourseData" + no + " courseId[0x7f070004?]=" + courseId);
		if(courseId != 0)
		{
	        TypedArray courceTypedArray = m_Resources.obtainTypedArray(courseId);

	        // 配列の要素数(ここではCourseDataの子要素の数)
	        int courseLength = courceTypedArray.length();
	        Log.v("MarathonApplication", "courseLength:" + courseLength);
			Course courseData;

			// 要素数分ループしてコースデータを追加していく
	        for(int i = 0; i < courseLength; i++)
	        {
	            // 配列の値を取得
	        	int resourceId = courceTypedArray.getResourceId(i, -1);
	            Log.v("MarathonApplication", "SetConvention Course resourcesId[" + resourceId + "]");
	        	if(resourceId != -1)
	        	{
	        		String[] array = m_Resources.getStringArray(resourceId);
	                Log.v("MarathonApplication", TextUtils.join(",", array));
	        		courseData = new Course(Double.valueOf(array[0]),Double.valueOf(array[1]),Integer.valueOf(array[2]));
	        		m_CourseList.add(courseData);
	        	}
	        }
		}

		//////////////////////
		// 距離表示情報取得 //
		//////////////////////
        m_DistanceList = new ArrayList<Distance>();

        int distanceId = m_Resources.getIdentifier("DistancePositions" + no, "array", PACKAGENAME);
        if(distanceId != 0)
        {
	        TypedArray distanceTypedArray = m_Resources.obtainTypedArray(distanceId);
	        // 配列の要素数(ここではDistanceDataの子要素の数)
	        int distanceLength = distanceTypedArray.length();
			Distance distanceData;

			// 要素数分ループして距離データを追加していく
	        for(int i = 0; i < distanceLength; i++)
	        {
	            // 配列の値を取得
	        	int resourceId = distanceTypedArray.getResourceId(i, -1);
	            Log.v("MarathonApplication", "SetConvention Distance distanceId[" + distanceId + "]");
	        	if(resourceId != -1)
	        	{
	        		String[] array = m_Resources.getStringArray(resourceId);
	                Log.v("MarathonApplication", TextUtils.join(",", array));
	                distanceData = new Distance(Double.valueOf(array[0]),Double.valueOf(array[1]),array[2],array[3]);
	        		m_DistanceList.add(distanceData);
	        	}
	        }

        }

		//////////////////////////
		// 応援位置表示情報取得 //
		//////////////////////////
        m_BestPositionList = new ArrayList<BestPosition>();

        int bestPositionId = m_Resources.getIdentifier("BestPosition" + no, "array", PACKAGENAME);
        if(bestPositionId != 0)
        {
	        TypedArray bestPositionTypedArray = m_Resources.obtainTypedArray(bestPositionId);
	        // 配列の要素数(ここではBestPositionの子要素の数)
	        int bestPositionLength = bestPositionTypedArray.length();
			BestPosition bestPositionData;

			// 要素数分ループして距離データを追加していく
	        for(int i = 0; i < bestPositionLength; i++)
	        {
	            // 配列の値を取得
	        	int resourceId = bestPositionTypedArray.getResourceId(i, -1);
	            Log.v("MarathonApplication", "SetConvention BestPosition bestPositionId[" + bestPositionId + "]");
	        	if(resourceId != -1)
	        	{
	        		String[] array = m_Resources.getStringArray(resourceId);
	                Log.v("MarathonApplication", TextUtils.join(",", array));
	                bestPositionData = new BestPosition(Double.valueOf(array[0]),Double.valueOf(array[1]),array[2]);
	                m_BestPositionList.add(bestPositionData);
	        	}
	        }
        }


		return true;
	}

	// コース内のポイント位置の数を返す。
	// 大会未設定や、コースデータがない場合は0を返す。
	public int GetCourseMaxPointNum()
	{

        if((0 == SettingCourseNo) || (m_CourseList == null))
		{
			return 0;
		}
        Log.v("MarathonApplication", "GetCourseMaxPointNum[" + m_CourseList.size() + "]");

		return m_CourseList.size();
	}

	// 設定された大会番号のコースデータを
	// 引数のNoによって値を返す。
	public GeoPoint GetCourseData(int index)
	{
		if(0 == SettingCourseNo)
		{
			return null;
		}
		else
		{
	        Log.v("MarathonApplication", "GetCourseData[" + index + "]");
			return m_CourseList.get(index).getGeoPoint();
		}
	}

	// 設定された大会番号のコースデータの緯度を
	// 引数のNoによって値を返す。
	public double GetCourseDataLatitude(int index)
	{
		if(0 == SettingCourseNo)
		{
			return -1;
		}
		else
		{
	        Log.v("MarathonApplication", "GetCourseDataLatitude[" + index + "]");
			return m_CourseList.get(index).Latitude;
		}
	}

	// 設定された大会番号のコースデータの経度を
	// 引数のNoによって値を返す。
	public double GetCourseDataLangitude(int index)
	{
		if(0 == SettingCourseNo)
		{
			return -1;
		}
		else
		{
	        Log.v("MarathonApplication", "GetCourseDataLangitude[" + index + "]");
			return m_CourseList.get(index).Langitude;
		}
	}

	// 設定された大会番号のコースデータの角度を
	// 引数のindexによって値を返す。
	public int GetCourseDataAngle(int index)
	{
		if(0 == SettingCourseNo)
		{
			return -1;
		}
		else
		{
	        Log.v("MarathonApplication", "GetCourseDataAngle[" + index + "]");
			return m_CourseList.get(index).Angle;
		}
	}


	// コース内のポイント位置の数を返す。
	// 大会未設定や、距離表示情報データがない場合は0を返す。
	public int GetDistanceMaxPointNum()
	{
		if((0 == SettingCourseNo) || (m_DistanceList == null))
		{
			return 0;
		}
	    Log.v("MarathonApplication", "GetDistanceMaxPointNum[" + m_DistanceList.size() + "]");
		return m_DistanceList.size();
	}

	// 設定された大会番号の距離表示情報データの緯度を
	// 引数のNoによって値を返す。
	public double GetDistanceDataLatitude(int index)
	{
		if(0 == SettingCourseNo)
		{
			return -1;
		}
		else
		{
		     Log.v("MarathonApplication", "GetDistanceDataLatitude[" + index + "]");
			return m_DistanceList.get(index).Latitude;
		}
	}

	// 設定された大会番号の距離表示情報データの経度を
	// 引数のNoによって値を返す。
	public double GetDistanceDataLangitude(int index)
	{
		if(0 == SettingCourseNo)
		{
			return -1;
		}
		else
		{
	        Log.v("MarathonApplication", "GetDistanceDataLangitude[" + index + "]");
			return m_DistanceList.get(index).Langitude;
		}
	}

	// 設定された大会番号の距離表示情報データのタイトルを
	// 引数のindexによって値を返す。
	// return nullに変更
	public String GetDistanceDataTitle(int index)
	{
		if(0 == SettingCourseNo)
		{
			return null;
		}
		else
		{
	        Log.v("MarathonApplication", "GetDistanceDataTitle[" + index + "]");
			return m_DistanceList.get(index).Title;
		}
	}

	// 設定された大会番号の距離表示情報データのを
	// 引数のindexによって値を返す。
	public String GetDistanceDataComment(int index)
	{
		if(0 == SettingCourseNo)
		{
			return null;
		}
		else
		{
	        Log.v("MarathonApplication", "GetDistanceDataComment[" + index + "]");
			return m_DistanceList.get(index).Comment;
		}
	}

	// XMLデータを読み込んでクラス内に展開する。
	public void MarathonMapDataXMLParse(int Id)
	{
		// 格納するList群の初期化
		m_CourseList = new ArrayList<Course>();
		m_DistanceList = new ArrayList<Distance>();
		m_BestPositionList = new ArrayList<BestPosition>();
	}
}